package utils

import (
	"chat_gin/entity/models"
	"context"
	"fmt"
	redis "github.com/go-redis/redis/v8"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

// InitConfig 初始化配置信息
func InitConfig() {
	viper.SetConfigName("app")
	viper.AddConfigPath("config")
	err := viper.ReadInConfig()
	if err != nil {
		fmt.Println("读取viper错误", err)
	}
}

var DB *gorm.DB
var err error
var RedisDB *redis.Client

// InitMySQL 初始化MySQL连接
func InitMySQL() {
	// 添加日志
	dns := viper.GetString("mysql.dns")
	DB, err = gorm.Open(mysql.Open(dns), &gorm.Config{
		// gorm日志模式：silent
		//Logger: logger.Default.LogMode(logger.Silent), 不显示SQL
		Logger: logger.Default.LogMode(logger.Info), // 显示所有SQL
		// 外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
		// 禁用默认事务（提高运行速度）
		SkipDefaultTransaction: true,
		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			SingularTable: true,
		},
	})

	err = DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&models.UserBasic{})
	if err != nil {
		fmt.Println("初始化user表失败", err)
		return
	}
}

// InitRedis 初始化redis
func InitRedis() {
	RedisDB = redis.NewClient(&redis.Options{
		Addr: viper.GetString("redis.addr"),
		DB:   viper.GetInt("redis.DB"),
	})
	fmt.Println(RedisDB)
}

const (
	PUblishKey = "websocket"
)

// Publish 定义redis发布方法
func Publish(ctx context.Context, channel string, msg string) error {
	fmt.Println("Publish 定义redis发布方法", ctx, channel)
	var err error
	fmt.Println("MySQL的连接")
	err = RedisDB.Publish(ctx, channel, msg).Err()
	if err != nil {
		fmt.Println("publish错误", err)
	}
	return err
}

// Subscribe 定义订阅方法
func Subscribe(ctx context.Context, channel string) (string, error) {
	fmt.Println("定义订阅方法", ctx, channel)
	sub := RedisDB.Subscribe(ctx, channel)
	fmt.Println("订阅消息==========", ctx)
	message, err := sub.ReceiveMessage(ctx)
	fmt.Println(message)
	return message.Payload, err
}
